package com.qfedu.sign.provider.service.impl;

import com.qfedu.sign.common.untils.DateUtil;
import com.qfedu.sign.common.vo.R;
import com.qfedu.sign.provider.dao.SignDao;
import com.qfedu.sign.provider.entity.Sign;
import com.qfedu.sign.provider.service.intf.SignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Random;
@Service
public class SignServiceImpl implements SignService {
  @Autowired
  private SignDao dao;

    @Override
    public R sign(int uid) {
        //企业级开发，需要考虑各种情况
        //1.校验是否可以签到
        //2.根据约定的规则 给予奖励
        //3.首次签到
        //4.断签，符合回归签到
        //5.断签
        //6.连续签到，不满足16天以上
        //7.连续签到，满足16天以上
      //1、入参效验
       if (uid>0){
           //2.查询最新的签到数据
           Sign sign = dao.selectUidLast(uid);
           double ext=0;
           int days = 1;//连续签到次数
           //3是否是首次签到
           if (sign == null){
               ext = 0.05;
           }else {
               //4、计算签到的相差天数
               int d = DateUtil.diffDays(sign.getSdate(), new Date());
               if (d==0){
                   //今天签到过
                   return R.fail("亲，你已经签到过，请明天再来!!!");
               }else if (d==1){//6、效验连续签到
                   //7、记录连续签到的天数
                    days = sign.getDays()+1;
                    //8、是否连续签到16天及以上
                   if(days>=16){
                       //连续签到16天
                       ext =0.2;
                   }else {
                       //9、连续签到 每天递增0.01
                       ext=(sign.getDays()+1)*0.01;
                   }
               }else {
                   //断签
                   //10、验证断签时间，有没有超过一年
                   if (d>=365){
                       //超过一年没有签到，首次签到给与回归奖励
                       ext=0.5;
                   }
               }

           }
           //11、生成签到信息
           Sign currSign = new Sign();
           currSign.setUid(uid);
           currSign.setBasereward((new Random().nextInt(5)+1)/100.0);
           currSign.setExtreward(ext);
           currSign.setDays(days);
           currSign.setCtime(new Date());
           currSign.setSdate(new Date());
           //12.保存数据到数据库
           if(dao.insert(currSign)>0){
               return R.ok(currSign);
           }

       }


        return R.fail();
    }

    @Override
    public R checkSign(int uid) {
        //1.入参校验
        if(uid>0){
            //2.查询最后一次签到数据
            Sign sign=dao.selectUidLast(uid);
            //3.校验是否有签到数据
            if(sign!=null){
                //4.计算今天能都签到
                if(DateUtil.diffDays(sign.getSdate(),new Date())>0){
                    return R.ok();
                }
            }else {
                return R.ok();
            }
        }
        return R.fail();
    }

    @Override
    public R queryMonth(int uid) {
        return null;
    }

    @Override
    public R queryUid(int uid) {
        if(uid>0){
            return R.ok(dao.selectByUid(uid));
        }else {
            return R.fail();
        }
    }
}
